home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / task / timedwait.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  1.3 KB  |  68 lines

  1.  
  2. #include "tek/exec.h"
  3. #include "tek/debug.h"
  4. #include "tek/kn/exec.h"
  5.  
  6. /* 
  7. **    TEKlib
  8. **    (C) 2001 TEK neoscientists
  9. **    all rights reserved.
  10. **
  11. **    TUINT signals = TTimedWait(TAPTR task, TUINT sigmask, TTIME *timeout)
  12. **
  13. **    suspend task to wait for a set of signals, or for a timeout.
  14. **    when timeout is TNULL or (timeout->sec == 0 && timeout->usec == 0),
  15. **    then this function is equivalent to TTaskWait.
  16. */
  17.  
  18. TUINT TTimedWait(TAPTR task, TUINT sigmask, TTIME *timeout)
  19. {
  20.     if (task)
  21.     {
  22.         if (timeout)
  23.         {
  24.             if (timeout->sec || timeout->usec)
  25.             {    
  26.                 TUINT signals;
  27.                 TTIME t;
  28.                 TFLOAT total, tf1, newdelay;
  29.  
  30.                 total = TTIMETOF(timeout);
  31.                 TTimeQuery(task, &t);
  32.                 tf1 = TTIMETOF(&t);
  33.                 
  34.                 for (;;)
  35.                 {            
  36.                     signals = TSetSignal(task, 0, sigmask) & sigmask;
  37.                     if (signals)
  38.                     {
  39.                         return signals;
  40.                     }
  41.                     
  42.                     if (!kn_timedwaitevent(&((TTASK *) task)->sigevent, &((TTASK *) task)->timer, timeout))
  43.                     {
  44.                         return 0;
  45.                     }
  46.  
  47.                     TTimeQuery(task, &t);
  48.                     newdelay = total - (TTIMETOF(&t) - tf1);
  49.                     if (newdelay < 0.000001f)
  50.                     {
  51.                         kn_doevent(&((TTASK *) task)->sigevent);    /* make event pending again */
  52.                         return 0;
  53.                     }
  54.  
  55.                     TFTOTIME(newdelay, &t);
  56.                     timeout = &t;
  57.                 }
  58.             }
  59.         }
  60.         
  61.         if (sigmask)
  62.         {
  63.             TWait(task, sigmask);
  64.         }
  65.     }
  66.     return 0;
  67. }
  68.